import java.io.*;
import java.util.*;

public class StudentCourseSimulation {
    // 定义一个学生类，包含姓名和选课课表
    public static class Student implements Serializable {
        String name;
        List<Course> courses;
    }

    // 定义一个课程类，包含课程名称和课程编号
    public static class Course implements Serializable {
        String name;
        String number;

        public Course(String class_name, String id) {
            this.name = class_name;
            this.number = id;
        }

        public String toString() {
            return "Course[name=" + name + ", number=" + number + "]";
        }
    }

    // 定义一个学生选课系统
    public static class CourseSelectionSystem {
        // 使用一个 HashMap 来存储所有的学生和课程信息
        Map<String, Student> students;

        // 初始化学生选课系统
        public CourseSelectionSystem() {
            students = new HashMap<>();
        }

        // 学生选课
        public void addCourse(String studentName, Course course) {
            // 先查找学生是否存在，不存在则新建一个学生对象
            Student student = students.get(studentName);
            if (student == null) {
                student = new Student();
                student.name = studentName;
                student.courses = new ArrayList<>();
                students.put(studentName, student);
            }

            // 将课程添加到学生的选课课表中
            student.courses.add(course);
        }

        // 学生退课
        public void removeCourse(String studentName, Course course) {
            // 先查找学生是否存在
            Student student = students.get(studentName);
            if (student != null) {
                // 从学生的选课课表中移除课程
                student.courses.remove(course);
            }
        }

        // 保存选课结果到文件
        public void saveToFile(String fileName) throws IOException {
            try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName))) {
                // 使用 writeObject 方法将所有学生和课程信息写入文件
                out.writeObject(students);
            }
        }

        // 从文件中读取选课结果
        public void loadFromFile(String fileName) throws IOException, ClassNotFoundException {
            try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName))) {
                // 使用 readObject 方法从文件中读取学生和课程信息
                students = (Map<String, Student>) in.readObject();
            }
        }

        // 打印所有学生的选课课表
        public void printStudentCourses() {
            for (Student student : students.values()) {
                System.out.println(student.name + ":");
                for (Course course : student.courses) {
                    System.out.println("  " + course);
                }
            }
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        CourseSelectionSystem system = new CourseSelectionSystem();// 向选课系统中添加学生和课程信息
        system.addCourse("张三", new Course("语文", "001"));
        system.addCourse("张三", new Course("数学", "002"));
        system.addCourse("张三", new Course("英语", "003"));
        system.addCourse("李四", new Course("语文", "001"));
        system.addCourse("李四", new Course("数学", "002"));

    // 保存选课结果到文件
        system.saveToFile("courses.dat");

    // 重新创建一个选课系统
        system = new CourseSelectionSystem();

    // 从文件中读取选课结果
        system.loadFromFile("courses.dat");

    // 学生退课
        system.removeCourse("张三", new Course("英语", "003"));

    // 打印所有学生的选课课表
        system.printStudentCourses();
    }
}